home *** CD-ROM | disk | FTP | other *** search
/ Linux Cubed Series 8: LINUX Games / Linux Cubed Series 8 - LINUX Games.iso / games / muds / lambdamo.7 / lambdamo / MOO-1.7.7 / ChangeLog.txt next >
Text File  |  1994-06-04  |  38KB  |  697 lines

  1. Version 1.0.0, 5 February 1991
  2. -- First public release.
  3.  
  4. Version 1.1.0, 8 February 1991
  5. -- recycle(x) now calls x:recycle() before destroying the object.
  6. -- the little-used and functionally-dubious update() function has been removed.
  7.    **** NOTE: Technically, this change should make this a major release, since
  8.    ****       it can break old code that depended on update() existing.  In
  9.    ****       practice, however, only $prog:@update used it (in LambdaCore.db,
  10.    ****       anyway).  Thus, to install this server, you should first @rmverb
  11.    ****       $prog:@update, since its code would otherwise be syntactically
  12.    ****       illegal.
  13. -- added renumber() and reset_max_object(), to facilitate automatically
  14.    generating new versions of LambdaCore.db from the current LambdaMOO db.
  15. -- made it so that only wizards can set the .name property of players; code in
  16.    the database now checks that players keep unique names.
  17. -- added set_player_flag() and boot_player() to enable registration-style
  18.    player creation and @toad-ing.
  19.  
  20. Version 1.1,1, 12 February 1991
  21. -- Much rearrangement of #include's to come as close as possible to conformance
  22.    with ANSI C and POSIX.
  23. -- Many changes to improve portability, especially to sites with only 'nearly'
  24.    ANSI-compliant compilers.
  25. -- Added backtrace-printing for tasks aborted for running too long.
  26.  
  27. Version 1.1.2, 13 February 1991
  28. -- Fixed nasty infinite recursion problem on server panic.
  29. -- Fixed the implementation of renumber() to really do the job.  It's now much
  30.    more expensive (linear in the size of the database rather than constant
  31.    time), but at least it's correct.  It's only intended for use on a tiny
  32.    DB anyway.
  33.  
  34. Version 1.1.3, 11 March 1991
  35. -- Fixed benign unparsing bug that always parenthesized unary-minus
  36.    expressions.
  37. -- Changed move() to insert the newly-moved object as the last item in the
  38.    contents list, rather than the first.
  39. -- Fixed a less-than-benign bug in the unparsing of conditional expressions,
  40.    where 'x ? y | (z ? w | v)' was being unparsed without the parentheses.
  41. -- Fixed a bug whereby an extra checkpoint timer was created every time the
  42.    '.dump' command was used.
  43. -- Added printing the value of 'this' to error backtraces whenever it is
  44.    different from the verb location.
  45. -- Fixed bug in propagation of property ownership on object creation.
  46. -- WARNING: I believe that there is a storage leak somewhere in the server.  If
  47.             so, it is not very fast.  With any luck, I'll find it soon.  For
  48.             safety's sake, check on the size of your server's address space
  49.             and reboot the server every few days if it's getting large.
  50.  
  51. Version 1.2.0, 11 April 1991
  52. -- Fixed bug in parser that made 'after' a reserved word; this was part of an
  53.    old (and never completely implemented) alternative syntax for the 'fork'
  54.    statement.
  55. -- Added memory_usage() function, to help in tracking down any memory-leak
  56.    bugs, among other things.
  57. -- Removed ancient restrictions on players recycling themselves.
  58. -- Changed recycle() so that children of recycled objects are not themselves
  59.    recycled.  Instead, they are adopted by their former grandparent.
  60. -- Fixed bugs in which errors are returned from move() in certain cases.
  61. -- Removed useless error value E_BADMOVE.
  62. -- Fixed bug in move() that allowed the enterfunc to be called even if the
  63.    object being moved was no longer valid.
  64. -- Changed several uses of E_INVIND to E_INVARG; E_INVIND is now only used when
  65.    an attempt is made to fetch or store the value of a property or verb from an
  66.    invalid object.
  67. -- Changed several functions to improve consistency in the order in which
  68.    certain kinds of errors are checked for.
  69. -- Made the allocator keep track of statistics concerning memory usage by type
  70.    of object being allocated.
  71. -- Changed queued_tasks() to return the value of 'this' in each task as well.
  72.    This new value is returned at the end of the sublist for each task, so old
  73.    code should continue to work unless it depended upon the exact length of the
  74.    sublists.
  75. -- Changed set_task_perms() not to return E_PERM if the argument is the same as
  76.    the current permissions of the verb (i.e., if the change in permissions
  77.    would be a no-op).
  78. -- Made tonum() and toobj() more robust in the face of extra spaces before or
  79.    after tokens.
  80.  
  81. Version 1.3.0, 7 June 1991
  82. -- Removed the now-useless `.help' and `.mem' commands, and all code concerning
  83.    the also-removed CHECKMALLOC option.
  84. -- Fixed allocation bug in inheritance of 'dobjstr' and its ilk, when the
  85.    current value of the variable has the wrong type (e.g., 'dobjstr' is a list
  86.    when another verb-call happens).
  87. -- Fixed the timers implementation not to try to free storage inside an
  88.    interrupt procedure.
  89. -- Changed move() so that :accept is called even if it's a wizard doing the
  90.    moving; of course, the wizards gets to do the move even if :accept returns
  91.    false.
  92. -- Added 'off/off of' as a new preposition.
  93. -- Fixed the built-in parser to return #-1 ($nothing) for the empty string,
  94.    rather than #-2 ($ambiguous_match).
  95. -- Fixed a few bugs in how the allocator keeps track of types.
  96. -- Fixed two memory leaks:
  97.      1) If you returned or aborted from inside an iteration over a list,
  98.         the list was never freed.
  99.      2) If you killed a task, its associated environment was never freed.
  100. -- Added ticks_left() and seconds_left(), for determining how much longer the
  101.    current task will be allowed to run.
  102. -- Reduced the maximum number of seconds for each task from 60 to 15.
  103. -- Removed restriction that the first argument to notify() and boot_player()
  104.    must be a valid player object.
  105. -- Removed the .shutdown and .dump commands.
  106. -- Added shutdown() and dump_database() functions to replace their respective
  107.    built-in commands.  The shutdown() function takes a single string argument
  108.    that is printed to all players as their connections are closed.
  109. -- Added output_delimiters() as a way to discover the current PREFIX and SUFFIX
  110.    strings on a given connection.
  111. -- Completely rewrote and modularized the network interface (now in
  112.    bsd_network.c), the main loop, connection-management, and checkpointing code
  113.    (now in server.c), and the task dispatcher (now in tasks.c).
  114. -- Eliminated the notion of `clocks' associated with tasks.  All tasks,
  115.    including forked tasks, begin execution with a full complement of ticks and
  116.    seconds.  To make this reasonable, the task dispatcher maintains a separate
  117.    queue per player, with command tasks and ready forked tasks intermingled.
  118.    Thus, a malicious player who forks many tasks can only clog his own queue.
  119. -- Eliminated the `command burst' heuristics from the dispatcher; this always
  120.    seemed like just a patch for having a fair dispatcher anyway.
  121. -- Added a timeout for closing idle un-logged-in connections.
  122. -- Removed the QUIT command; the boot_player() function can now be used for
  123.    that purpose.  boot_player() now does a normal disconnect, including running
  124.    the disfuncs.  At the same time, I made it allow players to boot themselves.
  125. -- Because clocks have been eliminated, the lists returned by queued_tasks()
  126.    have changed somewhat, though in a mostly-compatible way.  The clock ID and
  127.    clock ticks fields are both constant now, with the ticks equal to 20,000.
  128. -- ****************** All processing of commands typed by un-logged-in players
  129.    *** VITAL NOTE *** has been moved into the database.  Every un-logged-in
  130.    ****************** connection is assigned a unique negative player number.
  131.    The functions notify() and boot_player() can be used by wizards to send
  132.    text to and to terminate such a connection, respectively, using that player
  133.    number as the connection identifier.  Each line of input on such a
  134.    connection is first parsed into words in the usual way and then these words
  135.    are passed as the arguments to #0:do_login_command().  For example, the line
  136.        connect Munchkin frebblebit
  137.    would result in the following call being made:
  138.     #0:do_login_command("connect", "Munchkin", "frebblebit")
  139.    If #0:do_login_command returns a valid player object, then the connection is
  140.    considered to have logged into that player.  When the connection is first
  141.    established, the null command is automatically entered, resulting in a call
  142.    to #0:do_login_command with no arguments.  This signal can be used by the
  143.    verb to print out a welcome message, for example; this service is no longer
  144.    provided by the server.
  145.       Because of this change, it will be **NECESSARY** to add an implementation
  146.    of #0:do_login_command to your database *before* beginning to use version
  147.    1.3.0 of the server.  The Minimal.db database and the version of the
  148.    LambdaCore database released concurrently with 1.3.0 already provide such an
  149.    implementation.  The following code can be used as a simple implementation
  150.    that preserves most of the functionality of version 1.2.0:
  151.  
  152.     if (callers())
  153.       "This code should only be run as a server task.";
  154.       return;
  155.     endif
  156.     if (args == {})
  157.       args = {"help"};
  158.     endif
  159.     command = args[1];
  160.     args = args[2..length(args)];
  161.     nargs = length(args);
  162.     if (command == "connect")
  163.       if (nargs < 1)
  164.         notify(player,
  165.                "Usage:  connect <existing-player-name> <password>");
  166.       else
  167.         name = args[1];
  168.         password = nargs >= 2 ? args[2] | "";
  169.         for p in (players())
  170.           if (p.name == name
  171.               && (typeof(p.password) != STR
  172.               || (length(p.password) >= 2
  173.               && crypt(password, p.password[1..2]) == p.password)))
  174.         p.last_connect_time = time();
  175.         return p;
  176.           endif
  177.         endfor
  178.         notify(player, "Unknown player or wrong password.");
  179.       endif
  180.     elseif (command == "create")
  181.       if (nargs != 2)
  182.         notify(player, "Usage:  create <new-player-name> <new-password>");
  183.       else
  184.         name = args[1];
  185.         password = args[2];
  186.         for p in (players())
  187.           if (p.name == name)
  188.         notify(player, "That player name is already in use.");
  189.         return 0;
  190.           endif
  191.         endfor
  192.         new = create($player_class, $nothing);
  193.         set_player_flag(new, 1);
  194.         new.name = name;
  195.         new.aliases = {name};
  196.         new.programmer = $player_class.programmer;
  197.         new.password = crypt(password);
  198.         new.last_connect_time = time();
  199.         move(new, $player_start);
  200.         return new;
  201.       endif
  202.     elseif (strcmp(command, "QUIT") == 0)
  203.       boot_player(player);
  204.     else
  205.       msg = $welcome_message;
  206.       if (typeof(msg) != LIST)
  207.         msg = {msg};
  208.       endif
  209.       for line in (msg)
  210.         if (typeof(line) == STR)
  211.           notify(player, line);
  212.         endif
  213.       endfor
  214.     endif
  215.     return 0;
  216.  
  217.    Of course, the whole point of bringing this code into the database is to
  218.    enable easy experimentation with new facilities for un-logged-in users, such
  219.    as multiple Guest players, friendlier coping with similarly-named players,
  220.    provision of a `who' command, etc.
  221. -- The network interface now copes more nicely with running out of buffer
  222.    space for output to a player.  Before, excess output was simply dropped on
  223.    the floor; now, it instead attempts to push it out the network socket and
  224.    only flushes output when that doesn't work.  I was able to have a single
  225.    command send me over 60,000 characters of output without flushing any.
  226. -- The PREFIX and SUFFIX strings are no longer printed either for the .program
  227.    command or for any of the lines of program input.
  228. -- Recycled players with active connections are more promptly noticed and their
  229.    connections closed.
  230. -- The numeric ID associated with forked tasks is now guaranteed to be the same
  231.    as the value of task_id() in that task when it executes.
  232. -- The create() function now invokes the :initialize verb on the newly-created
  233.    object before returning it.  It is not an error if there is no :initialize
  234.    verb defined on the object.
  235. -- Changed listinsert() and listappend() never to generate E_RANGE errors.
  236.    Instead, the following expressions are now always equivalent:
  237.     listinsert(list, element, index)
  238.     listappend(list, element, index - 1)
  239.     {@list[1..index - 1], element, @list[index..length(list)]}
  240. -- Changed the matching algorithm for verb names so that the old behavior of
  241.    `*' matching anything is generalized to `foo*' matching anything beginning
  242.    with `foo'.
  243. -- Changed eval() and set_verb_code() to require programmer permissions.
  244. -- Added a timezone abbreviation onto the end of ctime()'s result.
  245. -- Added min(), max(), and abs() functions.
  246. -- The messages printed for running out of ticks and for running out of seconds
  247.    are now disinguishable.
  248.  
  249. Version 1.4.0, 22 August 1991
  250. -- Fixed a bug whereby running out of seconds might be misreported as running
  251.    out of ticks.
  252. -- Fixed a bug whereby using `@' on a non-list in a verb's argument list could
  253.    end up passing E_TYPE as the value of `args'.
  254. -- Fixed parsing bug that would ignore an extraneous comma at the front of an
  255.    argument list.
  256. -- Changed random() to raise E_INVARG on non-positive numerical arguments,
  257.    rather than E_TYPE.
  258. -- Fixed bug in handling of the case where a verb disappears between a
  259.    `.program' and the corresponding `.'.
  260. -- Made it a type error to use <, <=, >, or >= either on operands of different
  261.    types or on lists.
  262. -- Completely rewrote the MOO-code parser, unparser, and interpreter using a
  263.    new program representation based on vectors of bytecodes instead of abstract
  264.    syntax trees.  This saves space and time and also allows the interpreter to
  265.    be iterative instead of recursive.  This, in turn, allows us to implement
  266.    various operations that involve saving the entire state of a running task
  267.    for later resumption.
  268. -- Added read() and suspend() functions, using the new capabilities of the
  269.    interpreter.
  270. -- The new interpreter counts a few more ticks than the old one; in particular,
  271.    every IF, ELSEIF, and FORK now counts a tick.  In view of this, and in view
  272.    of the improved performance of the interpreter, the ticks limit for tasks
  273.    has been increased from 20,000 to 30,000.
  274. -- Added an indexed assignment statement for updating lists stored in variables
  275.    and properties.
  276. -- Fixed bug in numeric comparisons where `-2147483647 > 1' was false but
  277.    `-2147483647 > 2' was true.
  278. -- Fixed database dumping to detect and recover from filesystem errors.  For
  279.    normal periodic checkpoints, the dump attempt is simply abandoned.  For
  280.    panic and shutdown dumps, the server retries the dump from the beginning
  281.    after waiting 60 seconds (during which time, presumably, the archwizard will
  282.    fix whatever the problem was).  In all cases, explanatory messages are
  283.    printed in the log.  This should help mitigate the problems that arise when
  284.    there's no more room left on the filesystem on which the server is dumping.
  285. -- Enhanced the callers() function to return the verb-location and initial
  286.    value of `player' for each caller.
  287.  
  288. Version 1.4.5, 20 September 1991
  289. -- Made unparser failures panic the server rather than try to press on.
  290. -- Changed the task scheduler in two important ways:
  291.     1) Effectively gave each player's input tasks a higher priority than
  292.        their forked or suspended tasks.  This should both improve
  293.        interactive response and make it possible for users to recover from
  294.        accidentally forking off many tasks; they can now run commands to
  295.        kill those tasks and avoid having those commands wait behind all of
  296.        the forked tasks.
  297.     2) The scheduler no longer uses a strictly round-robin algorithm for
  298.        choosing which player's task to run next.  Instead, it keeps track
  299.        of how many seconds have been consumed by each player's tasks and
  300.        runs the next task from the queue with the least total `usage'.
  301.        Fresh queues and those queues that are empty when it becomes their
  302.        turn to run again are kept apart from non-empty queues.  When an
  303.        empty queue next gets a task to run, its usage is set equal to the
  304.        least usage of already-non-empty queues.  Thus, such queues go to
  305.        the head of the list but have no advantage over the queues that were
  306.        never empty.  This more complex scheduling scheme is intended to
  307.        ameliorate the problems with some players having long-running tasks
  308.        constantly runnable in the background; such players will now get
  309.        only their fair share of the server.
  310. -- Fixed queued_tasks() to list the player being read from as the owner of a
  311.    reading task.  This makes it consistent with kill_task(), which only allows
  312.    that player to kill such a task.
  313. -- Fixed a bug with my use of signal() on some POSIX-compliant machines.  One
  314.    possible consequence of the bug (actually manifest on the IRIS) is that all
  315.    checkpointing processes after the first one will never be waited for,
  316.    leaving `defunct' processes lying around until the server itself terminates.
  317. -- Fixed a small bug in my use of ANSI C: the `typedef enum Opcode Opcode;'
  318.    line in opcode.h must come *after* the definition of `enum Opcode'; unlike
  319.    struct types, enum types may not be forwardly referenced.  Thanks to yduJ
  320.    and the Lucid C compiler for finding this bug.
  321. -- Fixed a bug in the line-number-finding code; this bug was identical to one
  322.    we fixed long ago in the unparser.  Since the LNF code is *derived* from the
  323.    unparsing code, this is unsurprising.  What's embarassing is that we forgot
  324.    to fix the LNF code at the same time...
  325.  
  326. Version 1.5.0, 3 November 1991
  327. -- Added connection_name(player) to allow wizards some level of reasonable
  328.    control over whom they allow to connect to their servers.
  329. -- Changed read() to accept an optional argument, player, specifying the player
  330.    from whose connection to read.  If this argument is given, the check that
  331.    the current task is an input task is not done.  The only good use for this
  332.    that I'm aware of is in conjunction with the next change...
  333. -- The new compilation option OUTBOUND_NETWORK enables a new built-in function
  334.    called open_network_connection().  The arguments are specific to the network
  335.    module in use, but the intent is that they somehow specify a remote place to
  336.    which a network connection can be made.  For the default, BSD networking
  337.    module, there are two arguments, a host-name string and a port number.  The
  338.    function creates a connection to that place, if possible, and tricks the
  339.    rest of the server into believing that a normal connection just came from
  340.    that place.  Open_network_connection() returns the negative object number
  341.    that is the pseudo-player object for that connection.  One can then use
  342.    read() and notify() to send and receive lines of ASCII text on that
  343.    connection.  Of course, if the server should ever receive a line of input
  344.    when there's no task read()ing from the connection, that input will be
  345.    treated as a command in the usual way.  Also, unless the connection `logs
  346.    in' at some point, the usual five-minute timeout-if-no-input-received
  347.    connection shutdown will take place.  The usual practice is to have the same
  348.    task that opens the connection go into an infinite loop read()ing from it.
  349.    As usual, boot_player() can be used to shut down the connection.  This
  350.    function can only be called by wizards, of course.  If the OUTBOUND_NETWORK
  351.    option is not used, then open_network_connection() still exists, but always
  352.    raises E_PERM.
  353. -- Changed the bsd_network module to map tab to space on input, rather than
  354.    simply dropping tabs on the floor.
  355.  
  356. Version 1.5.1, 12 November 1991
  357. -- Fixed bug in checkpointing whereby the server's command log was flushed even
  358.    if the checkpoint failed.
  359. -- Various minor tweaks to make the server work on an IBM RS/6000.
  360.  
  361. Version 1.5.9, 6 December 1991
  362. -- Gave different ticks/seconds limits to non-input tasks. They get only 15,000
  363.    ticks and 5 seconds.
  364. -- The task seconds limit is now measured in server CPU seconds (as opposed to
  365.    wall-clock seconds) on systems that can support it.
  366. -- Adding some simple object-hierarchy checking and (in very simple cases)
  367.    repair code to the DB reading process.  If unfixable errors are found, the
  368.    server refuses to run.
  369. -- Fixed minor inconsistency in the log format.
  370. -- Fixed a few minor memory leaks.
  371. -- Fixed a bug whereby the bottom frame of a suspended task that was read from
  372.    the database file could be given the wrong size runtime value stack.
  373. -- Made the DB-reading code a bit pickier about the correctness of its input.
  374. -- Tweaked create() to make it more properly initialize the new object's
  375.    location and contents.
  376. -- Fixed bug in move() that could be tickled if an `accept' verb recycled
  377.    either the movee or the destination.
  378. -- Fixed several bugs in recycle() that could (and did!) corrupt the contents
  379.    hierarchy in the database.  The implementation is now much simpler, too!
  380.  
  381. Version 1.5.14, 3 March 1992
  382. -- Various minor tweaks to make the server work on a Macintosh running A/UX.
  383. -- Tweak to work around bug in isgraph() on systems that default to signed
  384.    characters.
  385. -- Fixed bug in boot_player() that didn't allow players to boot themselves.
  386.    [I know it says under release 1.3.0 above that boot_players() already worked
  387.    this way, but as far as I can see, that was a lie!]
  388. -- Fixed bsd_network startup sequence so that the server does not `listen' on
  389.    its port until after the DB has been read.  Connections during the
  390.    DB-reading phase will most likely time out.  I think this is better than the
  391.    old situation, in which those connections succeeded and then hung without
  392.    printing anything until the server finished reading in the DB.
  393. -- Changed behavior of server when there aren't enough file descriptors to
  394.    accept a new connection.  The server now arranges to stop just short of this
  395.    point and to immediately close any new connections after printing an
  396.    explanatory message.
  397. -- Fixed properties(), verbs(), x.contents, and queued_tasks() to run in time
  398.    linear in the length of their results, rather than quadratic.
  399.  
  400. Version 1.5.20, 24 July 1992
  401. -- Added check for an empty string as the second argument to strsub(); this now
  402.    raises E_INVARG.
  403. -- Conditionalized the keeping of the command log; it is now controlled by the
  404.    LOG_COMMANDS symbol.
  405. -- Removed a number of causes for GCC 2.1 to issue warnings about server code.
  406.    (Version 1.5.15)
  407. -- Fixed an ordering bug whereby the task queue for a newly-connected player
  408.    was not fully initialized when the :confunc task(s) were run.  In
  409.    particular, the new, connected queue was not marked as belonging to that
  410.    player, and certain functions like output_delimiters() would always fail
  411.    (not that that's a very interesting function to call in a :confunc, since
  412.    it's guaranteed to return {"", ""} then...).  (Version 1.5.16)
  413. -- Finally fixed the bug whereby it was possible to use chparent() to create a
  414.    situation in which an object defines a property with the same name as one
  415.    defined by one of its ancestors.  Such an attempt now results in chparent()
  416.    raising E_INVARG.  (Version 1.5.17)
  417. -- Finally fixed the bug whereby add_property() allowed the definition of a
  418.    property in a parent that was already defined in a child.  With this change,
  419.    it should no longer be possible to create a situation in which a parent and
  420.    child define properties with the same name.  (Version 1.5.18)
  421. -- Eliminated some minor warnings from the Dell SVR4 and HP/UX 9000 compilers.
  422.    (Version 1.5.19)
  423. -- Added logging of all instances of x.wizard = 1.
  424. -- The very first task run on booting the server is now a server task calling
  425.    #0:server_started() with player == #-1.  This task runs even before the
  426.    server gets the value of $dump_interval in order to schedule the first
  427.    checkpoint.  (Version 1.5.20)
  428.  
  429. Version 1.6.0, 13 August 1992
  430. -- Changed MOO-code parser to generate the old version 1.3 program-
  431.    representation based on abstract syntax trees.  These syntax trees are then
  432.    translated to vectors of bytecodes.  This is much cleaner and easier to
  433.    understand than the old method; perhaps surprisingly, it also appears to be
  434.    significantly faster, too.  (Version 1.5.21)
  435. -- Added support for compilation on MIPS SVR3 machines.
  436. -- Added support for a remote `checkpoint-request' signal (SIGUSR2), analogous
  437.    to the existing `shutdown-request' signal (SIGUSR1).
  438. -- Changed unparser to first convert bytecodes to trees and then use output
  439.    routines from version 1.3 of the server.  Same for line numbers.
  440. -- Error tracebacks now include line numbers for all frames on stack.
  441.    (Version 1.5.24)
  442. -- Cleaned up interpreter code.
  443. -- Added sqrt() and server_log() built in functions (Version 1.5.25)
  444. -- All built-in function registration procedures are now located in one list,
  445.    so it is easier to add new ones.
  446. -- Added match(), rmatch(), and substitute() built-in functions to handle
  447.    regular expression searches. (Version 1.6.0)
  448.  
  449. Version 1.6.1, 14 August 1992
  450. -- Fixed off-by-one bug in GNU regexp searching code.  (*sigh*)
  451.  
  452. Version 1.7.0, 23 October 1992
  453. -- Fixed behavior of index(), rindex(), match(), and rmatch() on empty pattern
  454.    and/or subject strings. (Version 1.6.3)
  455. -- Added the prefix `> ' to all log messages generated by the server_log()
  456.    built-in function, so that they can be distinguished from server-generated
  457.    messages.
  458. -- Added a compile-time option (OUT_OF_BAND_PREFIX) enabling a method of
  459.    entering commands that bypass both normal command parsing and any pending
  460.    read()ing task.  If OUT_OF_BAND_PREFIX is #define'd (in config.h) as a
  461.    non-empty string, then any lines of player input that begin with that prefix
  462.    will be parsed into a list of words and those words passed as arguments in a
  463.    server task invoking #0:do_out_of_band_command.  This is intended for use by
  464.    fancy MOO clients that need to send reliably-understood messages to the
  465.    server, such as window-event notifications.
  466. -- Added output to the `.program' built-in command, stating that it is obsolete
  467.    and will be replaced `soon' (i.e., in the next release).
  468. -- Rearranged the per-system configuration procedure for compiling the server;
  469.    now it should be easier for people to understand just what needs to be done
  470.    for their particular system.  The user changes in the Makefile are now
  471.    confined to specfying details of the compiler; all other kinds of options
  472.    are handled by editing the `config.h' file, which has been radically
  473.    reorganized.
  474. -- Renamed a few files (notably parse_command.[ch]) to fit within the
  475.    14-character limit imposed on certain systems.  (Version 1.6.4)
  476. -- Implemented reference counting on string and list values, replacing the old,
  477.    CPU-intensive deep copying method of storage management.
  478. -- Added subrange assignment for strings and lists.  Added indexed assignment
  479.    for strings.  (Version 1.6.5)
  480. -- Fixed bug whereby a read()ing task with no more input to consume was never
  481.    resumed if the connection being read was subsequently closed, from either
  482.    side.  Now the read() call raises E_INVARG, just as it would if the read()
  483.    were begun when the connection was already closed and no more input was left
  484.    to consume.
  485. -- Added TYPE_CLEAR value to properties, which cause property lookup on the
  486.    parent.  Added built in functions `clear_property()' and
  487.    `is_clear_property()' to assist in TYPE_CLEAR property manipulation.
  488. -- Added hash-lookup for properties and changed property definition
  489.    representation to be arrays instead of linked-lists, both to speed up
  490.    property lookup. (1.6.6)
  491. -- Added support for multiple complete networking implementations.  The first
  492.    use of this flexibility is a new SINGLE_USER option, which creates a version
  493.    of the server that accepts only one connection at a time and uses the
  494.    server's own standard input and output streams for it.
  495. -- Added a new built-in property on objects, the `f' (for `fertile') bit; it
  496.    replaces the use of the `r' bit to allow children to be made of the object
  497.    by either create() or chparent().  That is, now those operations check that
  498.    the `f' bit is set and disregard the setting of the `r' bit. (Version 1.6.7)
  499.    ******** Before upgrading an existing MOO to use this version of the server,
  500.    * NOTE * you should make sure that no object in your database already has a
  501.    ******** property named `f'; the following MOO program, run by a wizard,
  502.    will perform this check:
  503.         for i in [0..tonum(max_object())]
  504.           o = toobj(i);
  505.           if (ticks_left() < 1000 || seconds_left() < 2)
  506.             notify(player, tostr("Checking ", o, " ..."));
  507.             suspend(0);
  508.           endif
  509.           if (valid(o) && "f" in properties(o))
  510.             notify(player, tostr("*** ", o.name, " (", o,
  511.                          ") has an `f' property!"));
  512.           endif
  513.         endfor
  514.    After eliminating all such properties from the database and restarting with
  515.    this version of the server, you should, as a wizard, run the following MOO
  516.    code to initialize the `f' bits of all of the objects:
  517.         for i in [0..tonum(max_object())]
  518.           o = toobj(i);
  519.           if (ticks_left() < 1000 || seconds_left() < 2)
  520.             notify(player, tostr("Fixing ", o, ".f ..."));
  521.             suspend(0);
  522.           endif
  523.           if (valid(o))
  524.             o.f = o.r;
  525.           endif
  526.         endfor
  527. -- Reorganized the files so that all database modifying procedures were in one
  528.    of four modules. (Version 1.6.8)
  529. -- Reorganized existing network protocol and multiplexing wait implementations
  530.    into a pluggable modular form. (Version 1.6.9)
  531. -- Fixed bug in the interpreter that could pass a garbage program counter to
  532.    the line-number-finding code, used in printing error tracebacks.  The l-n-f
  533.    code responded semi-robustly by printing a message in the server log and
  534.    returning a line number of zero. (Version 1.6.10)
  535. -- Fixed bug whereby passing negative numbers to random() failed to evoke an
  536.    E_INVARG error.
  537. -- Fixed a bug in MOO-code compilation that led to real nastiness if there were
  538.    more than 255 literals in a single verb.
  539. -- Incorporated several new networking implementations, allowing for use by a
  540.    single-user (using the standard input and output streams of the server
  541.    itself), and by multiple users on either System V or BSD-style UNIX systems,
  542.    either with or without TCP/IP networking.  (Version 1.6.11)
  543. -- Fixed a bug in built-in function management that caused max() and min() to
  544.    always raise E_TYPE on some systems.
  545. -- Added a new automatic configuration system to the server distribution, so
  546.    that people do not, in general, need to know much of anything about their
  547.    local system in order to compile the server.  (Version 1.6.12)
  548. -- Fixed a misfeature of substitute whereby it was not possible to include a
  549.    percent-sign in the string that was to survive into the output.  Now, `%%'
  550.    is replaced by `%' in the output.  (Version 1.7.0)
  551.  
  552. Version 1.7.2, 3 August 1993
  553. -- Made tabs input as themselves, rather than being mapped to spaces.  This is
  554.    necessary in order to communicate with Gopher servers from within the MOO.
  555. -- Reduced the default `seconds-left' limit for task; forground tasks went from
  556.    15 to 5 seconds and background tasks from 5 to 3.
  557. -- Fixed regular-expression matching to respect task seconds limits, aborting
  558.    the match.
  559. -- Fixed bugs whereby both kill_task() and queued_tasks() would miss reading
  560.    tasks that had no ready input (i.e., whose associated task queues were
  561.    empty).
  562. -- Fixed memory leak when a read() call fails with E_INVARG; the copied
  563.    interpreter stack was never being freed.
  564. -- Fixed possible free of the null pointer during object recycling.
  565. -- Fixed a number of places that generated warnings in newer versions of GCC.
  566. -- Fixed inconsistency of the behavior of strcmp() between different server
  567.    machines; now it always returns one of 1, 0, or -1.
  568. -- Added a five-second timeout to outbound connection attempts, aborting them
  569.    if the timer expires.
  570. -- Made the error message to users about network buffers overflowing and lines
  571.    of output being flushed much more understandable.
  572. -- Added log entry for each time the server refuses a connection due to being
  573.    full.
  574. -- Fixed premature-free bug in preposition matching.
  575. -- Bowing to popular pressure, removed warning from `.program' command about
  576.    its (no longer) imminent demise.
  577. -- Added more error checks to options.h to make it easier for installers to
  578.    diagnose problems.
  579. -- Fixed a bunch of auto-configuration problems encountered by installers.
  580. -- Fixed a bug in substitute() where certain successful match() results were
  581.    rejected as invalid.
  582. -- Removed restrictions that only player objects could be used in place of `x'
  583.    in the following:
  584.     object.owner = x
  585.     add_property(object, pname, value, {x, perms})
  586.     set_property_info(object, pname, {x, perms})
  587.     add_verb(object, {x, perms, names}, args)
  588.     set_verb_info(object, vname, {x, perms, names})
  589.     set_task_perms(x)
  590.    That is, non-players may now own objects, verbs, and properties, and running
  591.    tasks may take on the authority of a non-player.
  592. -- Fixed bug where it was possible for a task to run out of seconds during a
  593.    call to set_verb_code() and have a truncated version of the program
  594.    installed as the new verb code.  Now, either all of it gets installed or
  595.    none of it.
  596. -- The log messages produced by successful open_network_connection() calls are
  597.    more useful now, containing the hostname and port of the connection.
  598. -- Outbound network connections are no longer susceptible to connection
  599.    timeouts due to a lack of input.
  600. -- Fixed a bug whereby verbs with numeric names screwed up DB loading, with the
  601.    wrong code getting put into some verbs and others getting no code at all.
  602.  
  603. Version 1.7.3, 4 August 1993
  604. -- Outbound connections no longer get a spurious blank line of input as soon as
  605.    they're created.
  606. -- Fixed stupid bug introduced in fixing bug in substitute().
  607. -- Fixed some bugs in the Makefile and the configuration script.
  608.  
  609. Version 1.7.4, 10 August 1993
  610. -- Fixed more configuration problems and warnings from GCC.
  611.  
  612. Version 1.7.5, 12 August 1993
  613. -- Added more log entries during loading, to make it clearer where the time is
  614.    being spent.
  615. -- Fixed a long-standing denial-of-service attack vulnerability, in which a
  616.    connection could keep the server from ever running any tasks at all by
  617.    *always* providing ready input.
  618.  
  619. Version 1.7.6, 11 October 1993
  620. -- The built-in command parser now matches the (in)direct object string against
  621.    the names of objects as well as their aliases.
  622. -- The server no longer calls :confunc or :disfunc directly when users connect
  623.    or disconnect; instead, it calls the following verbs on #0 in the
  624.    appropriate circumstances:
  625.     :user_created(USER)
  626.         When #0:do_login_command() returns USER, a valid player object
  627.         whose number is greater than the value max_object() returned
  628.         before the server called #0:do_login_command().  That is, when
  629.         a new user has been created.
  630.     :user_connected(USER)
  631.         When #0:do_login_command() returns USER, a previously-existing
  632.         valid player object for which no active connection already
  633.         existed.
  634.     :user_reconnected(USER)
  635.         When #0:do_login_command() returns USER, a previously-existing
  636.         valid player object for which there was already an active
  637.         connection.
  638.     :user_disconnected(USER)
  639.         After the end of a task that called either boot_player(USER) or
  640.         set_player_flag(USER, 0).
  641.     :user_client_disconnected(USER)
  642.         When USER's client unilaterally closes its connection to the
  643.         server.
  644.    ******** Before upgrading an existing MOO to use this version of the server,
  645.    * NOTE * you should install the following verbs on #0 in order to remain
  646.    ******** compatible with existing code; NOTE WELL that they should be
  647.    installed with the `d' permissions bit UNSET:
  648.     #0:"user_created user_connected"
  649.            user = args[1];
  650.         fork (0)
  651.           user:confunc();
  652.         endfork
  653.         user.location:confunc(user);
  654.     #0:"user_disconnected user_client_disconnected"
  655.            user = args[1];
  656.         fork (0)
  657.           user.location:disfunc(user);
  658.         endfork
  659.         user:disfunc();
  660. -- Non-wizard users can now use the read() built-in function when they give a
  661.    connected object they own as an argument.  Thus, it is possible, for
  662.    example, for a non-wizard to prompt itself for input.
  663. -- The match() and rmatch() built-in functions now cache some number of the
  664.    most recently used patterns, somewhat speeding up the matching process.
  665. -- The server now calls #0:checkpoint_started() whenever it starts to dump a
  666.    checkpoint of the database and #0:checkpoint_finished(SUCCESS) whenever the
  667.    dump finishes, where SUCCESS is true iff and only if the checkpoint was
  668.    successful.
  669. -- Fixed a bug (!) in the built-in command parser whereby in the command
  670.     ="This is in quotes" and this is not
  671.    the variable `verb' would correctly be set to "=This is in quotes" but the
  672.    variable `argstr' would be "is in quotes\" and this is not" instead of the
  673.    correct "and this is not".  (Reported by Shirgall.)
  674. -- Fixed some compilation problems with the SYSV/TCP configuration on Solaris
  675.    machines.
  676. -- The value of `argstr' when the server calls either #0:do_login_command() or
  677.    #0:do_out_of_band_command() is now the raw command line as received from the
  678.    connection, as opposed to the empty string.
  679.  
  680. Version 1.7.7, 20 December 1993
  681. -- Added some extra configuration tests and other changes to work around bugs
  682.    in HP/UX.
  683. -- Fixed an output-timing bug in calling the #0:checkpoint_started() hook.
  684. -- Fixed bug in the SYSV/LOCAL client whereby some output from the server could
  685.    be lost, never being printed.
  686. -- Added the server FIFO file name to an error message in the SYSV/LOCAL
  687.    configuration.
  688. -- Added the first rudimentary support for in-DB command parsing.  Each user
  689.    command is broken up into words, a list of which is passed as the arguments
  690.    in a call to #0:do_command(), if it exists, with `argstr' initialized to the
  691.    raw command line typed by the user.  If #0:do_command() does not exist, or
  692.    if that verb-call completes normally (i.e., without suspending or aborting)
  693.    and returns a false value, then the built-in command parser is invoked as
  694.    usual to handle the command.  Otherwise, it is assumed that the DB code
  695.    handled the command completely and no further action is taken by the server
  696.    for that command.
  697.